/**
 * 
 */
package logica.colecciones;
import java.awt.Color;
import java.io.Serializable;


import logica.datatypes.Jugador.DataJugador_R5;
import logica.datatypes.Jugador.DataJugador_R11;
import logica.datatypes.Jugador.DataJugador_R17;
import logica.clases.Jugador;
import logica.clases.Pais;
import java.io.Serializable;
import java.util.ArrayList;
/**
 * En jugadores se guardan los jugadores que participan en una determinada partida
 * Para implementar Jugadores se utiliza un arreglo ya que de acuerdo
 * con el analisis, es una coleccion acotada 
 */
public class Jugadores implements Serializable{
	private Jugador[] jugadores;	
	private int tope;
	private int max;
	private final static long serialVersionUID = 1;								
									
	public Jugadores(int cantJugadores){
		jugadores = new Jugador[cantJugadores]; 
		max = cantJugadores;
		tope = 0;
	}
	
	public int cantJugadores(){
		return tope;
	}
	
	public void insertar(Jugador jugador){
		if (tope<max){
			jugadores[tope]=jugador;
			tope++;
		}
	}
	
	
	public boolean existeJugador(String nombre){
		int i=0;
		boolean encontre=false;
		while (i < tope && !encontre){
			if ( nombre.equals(jugadores[i].getNombre()))
				encontre = true;
			else
				i++;
		}
		return encontre;
	}
	
	public boolean existeColor(Color color){
		int i=0;
		boolean encontre=false;
		while (i < tope && !encontre){
			if ( jugadores[i].getColor() == color)
				encontre = true;
			else
				i++;
		}
		return encontre;
	}
	
	public Jugador primerJugador(){
		return jugadores[0];
	}
	
	public void quitarPais(int numJugador, int numPais){
		jugadores[numJugador-1].quitarPais(numPais);	
	}
	
	public void agregarPais(int numJugador,Pais pais){
		jugadores[numJugador-1].agregarPais(pais);
	}
	
	public int obtenerCodJugador(String nombre){

		int i=0;
		boolean encontre=false;
		while (i < tope && !encontre){
			if ( nombre.equals(jugadores[i].getNombre()))
				encontre = true;
			else
				i++;
		}
		return jugadores[i].getNumero();
	}
	
	public Jugador obtenerJugador(int numero){	
		return jugadores[numero-1];
	}
	
	
	public Jugador obtenerJugadorEnTurno(){	
		int i=0;
		boolean encontre=false;
		while (i < tope && !encontre){
			if ( jugadores[i].isEnTurno())
				encontre = true;
			else
				i++;	
		}	
		return jugadores[i];
	}
	
	public void setearPrimerJugadorEnTurno(){
		jugadores[0].setEnTurno(true);
	}
	
	public boolean hayEnTurno(){

		int i=0;
		boolean encontre=false;
		while (i < tope && !encontre){
			if ( jugadores[i].isEnTurno())
				encontre = true;
			else
				i++;
		}
		return encontre;
	}
	
	public boolean jugadorEnTurno(int numero){

		int i=0;
		boolean encontre=false;
		while (i < tope && !encontre){
			if ( jugadores[i].getNumero() == numero)
				encontre = true;
			else
				i++;
		}	
		return jugadores[i].isEnTurno();
	}
	
	
	//Devuelve el siguiente jugador en turno teniendo en cuenta que debe tener paises asignados
	public Jugador siguienteEnTurno(int numero){ 

		boolean encontre=false;
		int pos = numero - 1;
		pos++;		
		
		while(!encontre){
			if (pos >= tope)
				pos = 0;
			else
				if(jugadores[pos].cantPaises() == 0 || !jugadores[pos].getLogueado())
					pos++;
				else
					//if(!jugadores[pos].getLogueado())	
						//pos++;
					//else
						encontre = true;
				
		}
		return jugadores[pos];
	}
	
	//Realiza el cambio de turno al siguiente jugador que posea paises
	public void cambiarTurnoAlSiguiente(){ 		
		int numero = obtenerJugadorEnTurno().getNumero();
		int cantJugadores = cantJugadores();
		boolean encontre=false;
		int pos = numero;				
		
		if (pos == cantJugadores)
			pos = 0;
		
		while(!encontre){
				if(jugadores[pos].cantPaises() == 0 ){
					pos++;
					if (pos == cantJugadores)
						pos = 0;
				}else
					encontre = true;
		}
		jugadores[numero-1].setEnTurno(false);
		jugadores[pos].setEnTurno(true);
	}
	
	public DataJugador_R5[] listarNomJugadores(){
		int cantJugadores = cantJugadores();
		DataJugador_R5 dataJugadores[] = new DataJugador_R5[cantJugadores];
		
		for (int i=0; i < cantJugadores; i++){
				dataJugadores[i]= jugadores[i].toDataJugador_R5();
		}
		return dataJugadores;
	}
	
	public DataJugador_R11[] cargaDataJugadores_R11(){
		int cantJugadores = cantJugadores();
		DataJugador_R11 dataJugadores[] = new DataJugador_R11[cantJugadores];
		
		for (int i=0; i < cantJugadores; i++){
				dataJugadores[i] = jugadores[i].toDataJugador_R11();
		}
		return dataJugadores;		
	}

	
	
	public DataJugador_R17[] cargaDataJugadores_R17(){
		int cantJugadores = cantJugadores();
		DataJugador_R17 dataJugadores[] = new DataJugador_R17[cantJugadores];
		
		for (int i=0; i < cantJugadores; i++){
				dataJugadores[i] = jugadores[i].toDataJugador_R17();
		}
		return dataJugadores;	
	}

	public void quitarCantFichas(int numJugador, int cantFichas) {
		obtenerJugador(numJugador).quitarCantFichas(cantFichas);
		
	}

	public int cantPaises(int codJugador) {
		return obtenerJugador(codJugador).cantPaises();
	}

	public void finalizarTurno(int codJugador) {
		obtenerJugador(codJugador).setEnTurno(false);
	}
	
	public ArrayList<Integer> codPaisesAsig(int codJugador){
		return obtenerJugador(codJugador).codPaisesAsig();
	}


	public boolean jugadorLogueado(int codJugador){
		return jugadores[codJugador-1].getLogueado();
	}
	

	public void setJugadorLogueado(int codJugador, boolean log){
		jugadores[codJugador-1].setLogueado(log);
	}
	
	//Devuelve true, si todos los jugadores estan logueados
	public boolean jugadoresLogueados(){
	boolean todosLogueados=true;
		for (int i=0; i < tope; i++)
			if(!jugadores[i].getLogueado())
				todosLogueados = false;
		return todosLogueados;
	}
}
